#include "ref.h"

void ref_dot_prod_f32(float32_t *pSrcA, float32_t *pSrcB, uint32_t blockSize,
                      float32_t *result)
{
    uint32_t i;
    float32_t sum = 0.0f;

    for (i = 0; i < blockSize; i++) {
        sum += pSrcA[i] * pSrcB[i];
    }
    *result = sum;
}

void ref_dot_prod_q31(q31_t *pSrcA, q31_t *pSrcB, uint32_t blockSize,
                      q63_t *result)
{
    uint32_t i;
    q63_t sum = 0.0f;

    for (i = 0; i < blockSize; i++) {
        sum += ((q63_t)pSrcA[i] * pSrcB[i]) >> 14; // 16.48
    }
    *result = sum;
}

void ref_dot_prod_q15(q15_t *pSrcA, q15_t *pSrcB, uint32_t blockSize,
                      q63_t *result)
{
    uint32_t i;
    q63_t sum = 0.0f;

    for (i = 0; i < blockSize; i++) {
        sum += (q31_t)pSrcA[i] * pSrcB[i]; // 34.30
    }
    *result = sum;
}

void ref_dot_prod_q7(q7_t *pSrcA, q7_t *pSrcB, uint32_t blockSize,
                     q31_t *result)
{
    uint32_t i;
    q31_t sum = 0.0f;

    for (i = 0; i < blockSize; i++) {
        sum += (q31_t)pSrcA[i] * pSrcB[i]; // 18.14
    }
    *result = sum;
}
